package com.booksystem.campuslibrarymanagementsystem.controller.admin;

import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.RulesManagement.Ruleslook;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.RulesManagement.Rulesupdate;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Verifys;
import com.booksystem.campuslibrarymanagementsystem.entity.BorrowingRulesTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.service.BorrowingRulesTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.AuditUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.CodeUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/Admin")
@Api(tags = "借阅规则设置")
public class RulesManagementController {
    private final String idt = "admin";
    Verifys verifys = new Verifys();
    BorrowingRulesTable borrowingRulesTable = new BorrowingRulesTable();
    @Autowired
    private BorrowingRulesTableService borrowingRulesTableService;

    @Autowired
    private AccountTableService accountTableService;

    /**
     * 1.借阅规则修改。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Rulesupdate（token，ruleid，maxborrowedbooks，borrowduration，renewallimit）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：提取新规则的值：
     * int maxBooks = rulesupdate.getMaxborrowedbooks();
     * 提取最大可借图书数量。
     * int maxData = rulesupdate.getBorrowduration();
     * 提取借阅期限（天数）。
     * int maxLimit = rulesupdate.getRenewalLimit();
     * 提取续借次数限制。
     * 检查新规则的有效性：
     * if (maxBooks > 0 && maxData > 0 && maxLimit > 0) {
     * 检查所有的新规则值是否都大于0。
     * 如果所有规则值都大于0，则继续执行更新操作。
     * 如果任何规则值小于等于0，则返回错误信息，“设置不符合现实”。
     * 获取当前时间：
     * String time = util.GetTime();
     * 获取当前时间，用于记录规则更新的时间。
     * 更新规则：
     * boolean a = borrowingRulesTableService.upDataRules(rulesupdate.getRuleid(), maxBooks, maxData, maxLimit, time);
     * 使用规则ID和新的规则值来更新借阅规则。
     * 如果更新成功（a为true），则返回成功信息，“更新成功”。
     * 如果更新失败（a为false），则返回错误信息，“更新失败”。
     * 返回结果：
     * 如果一切正常，返回处理结果信息（成功或失败）。
     */
    @PostMapping("/RulesUpdate")
    @ApiOperation(value = "借阅规则修改", notes = "修改借阅规则-借阅数量，期限，续借次数")
    public Result rulesUpdate(@RequestBody Rulesupdate rulesupdate) {
        verifys = AuditUtil.verifyUtil(rulesupdate.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                int maxBooks = rulesupdate.getMaxborrowedbooks();
                int maxData = rulesupdate.getBorrowduration();
                int maxLimit = rulesupdate.getRenewallimit();
                if (maxBooks > 0 && maxData > 0 && maxLimit > 0) {
                    String time = CodeUtil.codeGet();
                    boolean a = borrowingRulesTableService.upDataRules(rulesupdate.getRuleid(), maxBooks, maxData, maxLimit, time);
                    if (a) {
                        System.out.println("借阅规则修改成功");
                        return Result.success("更新成功", 1);
                    } else {
                        return Result.fail("更新失败");
                    }
                } else {
                    return Result.fail("设置不符合现实");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 2.借阅规则。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Ruleslook（token）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询到所有数据保存到 List<BorrowingRulesTable> borrowingRulesTable 中，判断borrowingRulesTable是否为空
     * 6.为空：返回失败信息-没有数据。不为空：返回数据到前端
     */
    @PostMapping("/RulesLook")
    @ApiOperation(value = "借阅规则", notes = "查看借阅规则")
    public Result<List<BorrowingRulesTable>> rulesLook(@RequestBody Ruleslook ruleslook) {
        verifys = AuditUtil.verifyUtil(ruleslook.getToken(),idt,accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                List<BorrowingRulesTable> borrowingRulesTable = borrowingRulesTableService.list();
                if (!borrowingRulesTable.isEmpty()) {
                    System.out.println("借阅规则发送成功");
                    return Result.success(borrowingRulesTable, borrowingRulesTable.size());
                } else {
                    return Result.fail("没有数据");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

}

